#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>



void handler(int signum)
{
    std::cout << "hello signal: " << signum << std::endl;
    while(true)
    {
        //不断获取pending表！
        sigset_t pending;
        sigpending(&pending);
        for(int i = 31; i >= 1; i--)
        {
            if(sigismember(&pending, i))
                std::cout << "1";
            else
                std::cout << "0";
        }
        std::cout << std::endl;
        sleep(1);
    }
    exit(0);
}


int main()
{
    struct sigaction act, oldact;
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    act.sa_flags = 0;// 默认信号处理逻辑

    sigaction(SIGINT, &act, &oldact); // 对2号信号进行捕捉

    while(true)
    {
        std::cout << "I am a process, pid: " << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}




// void PrintPending(sigset_t& pending)
// {
//     std::cout << "我是一个进程, pid: " << getpid() << ", pending: ";
//     for(int signo = 31; signo >= 1; signo--)
//     {
//         if(sigismember(&pending, signo))
//         {
//             std::cout << "1";
//         }
//         else
//         {
//             std::cout << "0";
//         }
//     }
//     std::cout << std::endl;
// }

// int main()
// {
//     // 1. 初始化
//     sigset_t block, oldblock;
//     sigemptyset(&block);
//     sigemptyset(&oldblock);

//     // 2. 添加信号到阻塞表中
//     for(int i = 31; i >= 1; i--)
//         sigaddset(&block, i);

//     // 3. 屏蔽信号
//     int n = sigprocmask(SIG_SETMASK, &block, &oldblock);
//     if(n < 0)
//     {
//         perror("sigprocmask");
//     }

//     while(true)
//     {
//         // 4. 获取pending信号集合
//         sigset_t pending;
//         int m = sigpending(&pending);
//         if(m < 0)
//         {
//             perror("sigpending");
//         }

//         // 5. 打印pending信号集合
//         PrintPending(pending);
//         sleep(1);
//     }

//     return 0;
// }









// int cnt = 0;

// void handlerSig(int sig)
// {
//     std::cout << "获得了一个信号: " << sig <<  "count: "  << cnt << std::endl;
//     //alarm(1);
//     exit(1);
// }

// int main()
// {

//     signal(SIGALRM, handlerSig);
//     alarm(1);
//     while (true)
//     {
//         //std::cout << "count: " << cnt << std::endl;
//         cnt++;
//     }
//     return 0;
// }



// int main()
// {

//     signal(SIGALRM, handlerSig);
//     alarm(1);
//     while (true)
//     {
//         std::cout << "I am a process, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }










// void handlerSig(int sig)
// {
//     std::cout << "获得了一个信号: " << sig << std::endl;
//     exit(12);
// }

// int main()
// {
//     for(int i = 1; i < 32; i++)
//         signal(i, handlerSig);

//     // for(int i = 1; i < 32; i++)
//     // {
//     //     sleep(1);
//     //     raise(i);
//     // }
//     while (true)
//     {
//         std::cout << "I am a process, pid: " << getpid() << std::endl;
//         sleep(1);
//         //abort();
//         // int a = 10;
//         // a /= 0; // 除0错误

//         int* p = NULL;
//         *p = 100; // 野指针

//     }
//     return 0;
// }